package com.sparrow.rpc.socket.codec;

import com.sparrow.rpc.socket.msg.RpcCodecMsg;
import com.sparrow.rpc.util.RpcUtil;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

/**
 *  RPC 编码器
 */
public class RpcEncoder extends MessageToByteEncoder<Object> {
    @Override
    protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) {
        if (!(msg instanceof RpcCodecMsg)) {
            throw new IllegalArgumentException("不支持的消息类型: " + msg.getClass());
        }
        RpcCodecMsg codecMsg = (RpcCodecMsg) msg;
        // 写入消息类型（占 1 字节）
        out.writeByte(codecMsg.getType());
        // 预留 4 字节给消息长度
        out.writeInt(0);
        // 序列化对象
        byte[] bytes = RpcUtil.getSerializer().serialize(msg);
        if (bytes == null) {
            throw new RuntimeException("序列化失败，得到的字节数组为 null");
        }
        // 写入序列化数据
        out.writeBytes(bytes);
        // 设置正确的消息长度
        out.setInt(1, bytes.length);
    }
}
